#!/bin/bash
# ============================================================================
# 恢复 CentOS 7.9 Python 2.7（当 Python 2.7 被删除时）
# ============================================================================
#
# 问题描述：
#   在 CentOS 7.9 上，如果 Python 2.7 被删除，yum 将无法工作
#   因为 yum 本身依赖 Python 2.7
#
# 解决方案：
#   1. 如果 yum 无法工作，使用 rpm 直接安装 Python 2.7
#   2. 或者临时修复 yum 使用 Python 3，然后安装 Python 2.7
#   3. 或者从其他源下载 Python 2.7 的 RPM 包
#
# 使用方法：
#   sudo ./ci/restore-python27.sh
#
# ============================================================================

set -u
# 不使用 set -e，因为需要处理多个可能的失败情况

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查是否为 root 用户
if [ "$EUID" -ne 0 ]; then
    log_error "此脚本需要 root 权限"
    log_info "请使用: sudo $0"
    exit 1
fi

# 检查系统类型
if [ ! -f /etc/redhat-release ]; then
    log_error "此脚本仅适用于 CentOS/RHEL 系统"
    exit 1
fi

log_info "=========================================="
log_info "恢复 CentOS 7.9 Python 2.7"
log_info "=========================================="

# 检查 Python 2.7 是否已存在
PYTHON2_PATH=""
if command -v python2.7 &> /dev/null; then
    PYTHON2_PATH=$(which python2.7)
elif [ -f /usr/bin/python2.7 ]; then
    PYTHON2_PATH="/usr/bin/python2.7"
elif [ -f /usr/bin/python2 ]; then
    PYTHON2_PATH="/usr/bin/python2"
    # 检查是否是 Python 2.7
    if ${PYTHON2_PATH} --version 2>&1 | grep -q "2.7"; then
        log_info "找到 Python 2.7: ${PYTHON2_PATH}"
    else
        PYTHON2_PATH=""
    fi
fi

if [ -n "$PYTHON2_PATH" ] && [ -f "$PYTHON2_PATH" ]; then
    log_success "Python 2.7 已存在"
    log_info "Python 2.7 路径: ${PYTHON2_PATH}"
    log_info "版本信息:"
    ${PYTHON2_PATH} --version 2>&1 || true
    
    # 检查是否需要创建软链接
    if [ "$PYTHON2_PATH" = "/usr/bin/python2" ] && [ ! -f /usr/bin/python2.7 ]; then
        log_info "创建 python2.7 软链接..."
        ln -sf /usr/bin/python2 /usr/bin/python2.7 2>/dev/null || true
    fi
    
    exit 0
fi

log_warning "未找到 Python 2.7 可执行文件，开始恢复..."

# 检查系统已安装的 Python 包版本
log_info "检查系统已安装的 Python 包..."
INSTALLED_PYTHON_VERSION=""
if rpm -q python &> /dev/null; then
    INSTALLED_PYTHON_VERSION=$(rpm -q python 2>/dev/null | sed 's/^python-//' || echo "")
    log_info "已安装: python-${INSTALLED_PYTHON_VERSION}"
elif rpm -q python2 &> /dev/null; then
    INSTALLED_PYTHON_VERSION=$(rpm -q python2 2>/dev/null | sed 's/^python2-//' || echo "")
    log_info "已安装: python2-${INSTALLED_PYTHON_VERSION}"
fi

if rpm -q python-devel &> /dev/null; then
    INSTALLED_DEVEL_VERSION=$(rpm -q python-devel 2>/dev/null | sed 's/^python-devel-//' || echo "")
    log_info "已安装: python-devel-${INSTALLED_DEVEL_VERSION}"
    # 如果找到 devel 版本，使用它作为主版本
    if [ -z "$INSTALLED_PYTHON_VERSION" ] && [ -n "$INSTALLED_DEVEL_VERSION" ]; then
        INSTALLED_PYTHON_VERSION="$INSTALLED_DEVEL_VERSION"
    fi
fi

if rpm -q python-libs &> /dev/null; then
    INSTALLED_LIBS_VERSION=$(rpm -q python-libs 2>/dev/null | sed 's/^python-libs-//' || echo "")
    log_info "已安装: python-libs-${INSTALLED_LIBS_VERSION}"
fi

# 如果找到已安装的版本，尝试安装匹配的版本
if [ -n "$INSTALLED_PYTHON_VERSION" ]; then
    log_info "检测到系统已安装 Python 包版本: ${INSTALLED_PYTHON_VERSION}"
    log_info "将尝试安装匹配的版本以避免冲突"
    
    # 提取版本号（如 2.7.5-94.el7_9）
    PYTHON_VERSION_MATCH="$INSTALLED_PYTHON_VERSION"
else
    PYTHON_VERSION_MATCH=""
fi

# 检查 yum 是否可用
YUM_AVAILABLE=false
if command -v yum &> /dev/null; then
    if yum --version &> /dev/null 2>&1; then
        YUM_AVAILABLE=true
        log_success "yum 可用"
    else
        log_warning "yum 命令存在但无法正常工作"
    fi
else
    log_warning "yum 命令不存在"
fi

# 方案 1: 如果 yum 可用，直接安装
if [ "$YUM_AVAILABLE" = true ]; then
    log_info "方案 1: 使用 yum 安装 Python 2.7..."
    
    if yum install -y python2 python2-devel python2-setuptools 2>&1 | tee /tmp/python2_install.log; then
        log_success "✅ Python 2.7 安装成功"
        
        # 验证安装
        if command -v python2.7 &> /dev/null || [ -f /usr/bin/python2.7 ]; then
            PYTHON2_PATH=$(which python2.7 2>/dev/null || echo "/usr/bin/python2.7")
            log_success "Python 2.7 路径: ${PYTHON2_PATH}"
            ${PYTHON2_PATH} --version 2>&1 || true
            exit 0
        fi
    else
        log_warning "yum 安装失败，尝试其他方案..."
    fi
fi

# 方案 2: 使用 rpm 直接安装（如果 yum 不可用）
log_info "方案 2: 使用 rpm 直接安装 Python 2.7..."

# 检查是否有 Python 3 可用（用于下载 RPM 包）
PYTHON3_AVAILABLE=false
PYTHON3_PATH=""
if command -v python3 &> /dev/null; then
    PYTHON3_PATH=$(which python3)
    PYTHON3_AVAILABLE=true
    log_info "找到 Python 3: ${PYTHON3_PATH}"
elif [ -f /usr/bin/python3 ]; then
    PYTHON3_PATH="/usr/bin/python3"
    PYTHON3_AVAILABLE=true
    log_info "找到 Python 3: ${PYTHON3_PATH}"
fi

# 临时修复 yum（如果 Python 3 可用）
if [ "$YUM_AVAILABLE" = false ] && [ "$PYTHON3_AVAILABLE" = true ]; then
    log_info "临时修复 yum 以使用 Python 3..."
    
    # 备份 yum
    if [ -f /usr/bin/yum ]; then
        cp /usr/bin/yum /usr/bin/yum.backup.before_python3_fix
        log_info "已备份 yum 到: /usr/bin/yum.backup.before_python3_fix"
        
        # 临时修改 yum 使用 Python 3
        sed -i "1s|^#!.*python.*|#!${PYTHON3_PATH}|" /usr/bin/yum 2>/dev/null || true
        
        # 测试 yum 是否可用
        if yum --version &> /dev/null 2>&1; then
            log_success "yum 已临时修复，可以使用"
            YUM_AVAILABLE=true
        else
            log_warning "yum 临时修复失败"
            # 恢复备份
            cp /usr/bin/yum.backup.before_python3_fix /usr/bin/yum 2>/dev/null || true
        fi
    fi
fi

# 如果 yum 现在可用，尝试安装
if [ "$YUM_AVAILABLE" = true ]; then
    log_info "使用修复后的 yum 安装 Python 2.7..."
    if yum install -y python2 python2-devel python2-setuptools 2>&1; then
        log_success "✅ Python 2.7 安装成功"
        
        # 恢复 yum 的原始配置（如果之前修改过）
        if [ -f /usr/bin/yum.backup.before_python3_fix ]; then
            log_info "恢复 yum 的原始配置..."
            cp /usr/bin/yum.backup.before_python3_fix /usr/bin/yum
            rm -f /usr/bin/yum.backup.before_python3_fix
        fi
        
        # 运行 fix-yum-python.sh 确保 yum 使用 Python 2.7
        if [ -f "ci/fix-yum-python.sh" ]; then
            log_info "运行 fix-yum-python.sh 确保 yum 配置正确..."
            bash ci/fix-yum-python.sh || log_warning "fix-yum-python.sh 执行失败，但 Python 2.7 已安装"
        fi
        
        # 验证安装
        if command -v python2.7 &> /dev/null || [ -f /usr/bin/python2.7 ]; then
            PYTHON2_PATH=$(which python2.7 2>/dev/null || echo "/usr/bin/python2.7")
            log_success "Python 2.7 路径: ${PYTHON2_PATH}"
            ${PYTHON2_PATH} --version 2>&1 || true
            exit 0
        fi
    fi
fi

# 方案 3: 从镜像源下载 RPM 包并手动安装
log_info "方案 3: 从镜像源下载 Python 2.7 RPM 包..."

# CentOS 7 的 Python 2.7 RPM 包
CENTOS_VERSION=$(rpm -q --qf "%{VERSION}" $(rpm -q --whatprovides redhat-release) 2>/dev/null || echo "7")
ARCH=$(uname -m)

# 尝试从多个镜像源下载（优先使用 vault，更稳定）
MIRRORS=(
    "http://vault.centos.org/${CENTOS_VERSION}.9.2009/os/${ARCH}/Packages/"
    "http://mirror.centos.org/centos/${CENTOS_VERSION}/os/${ARCH}/Packages/"
    "http://mirrors.aliyun.com/centos/${CENTOS_VERSION}/os/${ARCH}/Packages/"
    "http://mirrors.tuna.tsinghua.edu.cn/centos/${CENTOS_VERSION}/os/${ARCH}/Packages/"
)

# 根据已安装的版本确定要下载的 RPM 版本
PYTHON2_RPM_VERSIONS=()

if [ -n "$PYTHON_VERSION_MATCH" ]; then
    # 提取主版本号（如 2.7.5-94.el7_9 -> 2.7.5-94.el7_9）
    VERSION_PREFIX=$(echo "$PYTHON_VERSION_MATCH" | cut -d'-' -f1-2)
    VERSION_SUFFIX=$(echo "$PYTHON_VERSION_MATCH" | cut -d'-' -f3-)
    
    # 构建匹配的 RPM 文件名
    MATCHED_RPM="python-${PYTHON_VERSION_MATCH}.${ARCH}.rpm"
    PYTHON2_RPM_VERSIONS+=("$MATCHED_RPM")
    log_info "优先尝试匹配版本: $MATCHED_RPM"
    
    # 也尝试一些常见的变体
    if echo "$PYTHON_VERSION_MATCH" | grep -q "el7_9"; then
        # 如果是 el7_9，也尝试 el7
        ALT_VERSION=$(echo "$PYTHON_VERSION_MATCH" | sed 's/el7_9/el7/')
        PYTHON2_RPM_VERSIONS+=("python-${ALT_VERSION}.${ARCH}.rpm")
    fi
fi

# 添加其他常见版本作为备选
PYTHON2_RPM_VERSIONS+=(
    "python-2.7.5-94.el7_9.${ARCH}.rpm"
    "python-2.7.5-90.el7.${ARCH}.rpm"
    "python-2.7.5-89.el7.${ARCH}.rpm"
    "python-2.7.5-88.el7.${ARCH}.rpm"
    "python-2.7.5-86.el7.${ARCH}.rpm"
)

PYTHON2_DEVEL_RPM="python-devel-2.7.5-90.el7.${ARCH}.rpm"
PYTHON2_SETUPTOOLS_RPM="python-setuptools-0.9.8-7.el7.noarch.rpm"

TEMP_DIR=$(mktemp -d)
cd "$TEMP_DIR"

DOWNLOADED=false
PYTHON2_RPM=""

# 验证下载的文件是否是有效的 RPM 包
verify_rpm_file() {
    local file="$1"
    if [ ! -f "$file" ]; then
        return 1
    fi
    
    # 检查文件大小（RPM 包应该至少几 KB）
    local size=$(stat -f%z "$file" 2>/dev/null || stat -c%s "$file" 2>/dev/null || echo "0")
    if [ "$size" -lt 1024 ]; then
        log_warning "文件太小（${size} 字节），可能不是有效的 RPM 包"
        return 1
    fi
    
    # 如果文件包含 HTML 标签，肯定不是 RPM（优先检查，避免误判）
    if head -c 1024 "$file" 2>/dev/null | grep -qiE "<html|<!DOCTYPE|301|Moved|CloudFront"; then
        log_warning "文件包含 HTML 内容，可能是重定向页面"
        return 1
    fi
    
    # 检查文件类型（使用 file 命令）
    if command -v file &> /dev/null; then
        local file_type=$(file "$file" 2>/dev/null || echo "")
        if echo "$file_type" | grep -qiE "RPM|cpio archive"; then
            return 0
        fi
        if echo "$file_type" | grep -qiE "HTML|text|ASCII"; then
            log_warning "文件类型检测为文本/HTML: $file_type"
            return 1
        fi
    fi
    
    # 检查文件头（RPM 包以特定魔数开头）
    # RPM v3: 0xed 0xab 0xee 0xdb
    # RPM v4: "drpm" (0x64 0x72 0x70 0x6d)
    local first_bytes=$(head -c 4 "$file" 2>/dev/null | od -An -tx1 2>/dev/null | tr -d ' \n' || echo "")
    if echo "$first_bytes" | grep -qiE "edab|6472706d"; then
        return 0
    fi
    
    # 如果文件以 gzip 压缩开头（某些 RPM 包可能被压缩），也可能是有效的
    local first_byte=$(head -c 1 "$file" 2>/dev/null | od -An -tx1 2>/dev/null | tr -d ' \n' || echo "")
    if [ "$first_byte" = "1f" ]; then  # gzip 魔数
        log_info "文件可能是压缩的 RPM 包"
        return 0
    fi
    
    # 如果无法确定，但文件足够大且不是 HTML，认为可能有效
    log_warning "无法确定文件类型，但文件大小正常（${size} 字节）"
    return 0
}

for mirror in "${MIRRORS[@]}"; do
    log_info "尝试从镜像下载: $mirror"
    
    for rpm_name in "${PYTHON2_RPM_VERSIONS[@]}"; do
        log_info "  尝试下载: $rpm_name"
        
        # 尝试使用 wget（跟随重定向）
        if command -v wget &> /dev/null; then
            if wget -L --timeout=10 --tries=2 -q "${mirror}${rpm_name}" -O "${rpm_name}" 2>/dev/null; then
                if verify_rpm_file "${rpm_name}"; then
                    PYTHON2_RPM="${rpm_name}"
                    log_success "下载成功: ${PYTHON2_RPM}"
                    DOWNLOADED=true
                    break 2
                else
                    log_warning "下载的文件不是有效的 RPM 包，删除并重试..."
                    rm -f "${rpm_name}"
                fi
            fi
        fi
        
        # 尝试使用 curl（跟随重定向）
        if command -v curl &> /dev/null; then
            if curl -L -f -s --connect-timeout 10 --max-time 30 "${mirror}${rpm_name}" -o "${rpm_name}" 2>/dev/null; then
                if verify_rpm_file "${rpm_name}"; then
                    PYTHON2_RPM="${rpm_name}"
                    log_success "下载成功: ${PYTHON2_RPM}"
                    DOWNLOADED=true
                    break 2
                else
                    log_warning "下载的文件不是有效的 RPM 包，删除并重试..."
                    rm -f "${rpm_name}"
                fi
            fi
        fi
    done
    
    log_warning "镜像 $mirror 下载失败，尝试下一个..."
done

if [ "$DOWNLOADED" = false ] || [ -z "$PYTHON2_RPM" ]; then
    log_error "无法从镜像源下载有效的 Python 2.7 RPM 包"
    log_info ""
    log_info "可能的原因："
    log_info "  - 网络连接问题"
    log_info "  - 镜像源不可用或返回了重定向页面"
    log_info "  - RPM 包版本不匹配"
    log_info ""
    log_info "请手动执行以下步骤："
    log_info ""
    log_info "方案 1: 手动下载并安装"
    log_info "  1. 从以下地址下载 Python 2.7 RPM 包："
    log_info "     - http://vault.centos.org/${CENTOS_VERSION}.9.2009/os/${ARCH}/Packages/"
    log_info "     - http://mirror.centos.org/centos/${CENTOS_VERSION}/os/${ARCH}/Packages/"
    log_info ""
    log_info "  2. 需要下载的包（选择一个可用的版本）："
    log_info "     - python-2.7.5-90.el7.${ARCH}.rpm"
    log_info "     - python-devel-2.7.5-90.el7.${ARCH}.rpm"
    log_info "     - python-setuptools-0.9.8-7.el7.noarch.rpm"
    log_info ""
    log_info "  3. 下载后安装："
    log_info "     sudo rpm -ivh --force python-2.7.5-90.el7.${ARCH}.rpm"
    log_info "     sudo rpm -ivh --force python-devel-2.7.5-90.el7.${ARCH}.rpm"
    log_info ""
    log_info "  4. 修复 yum："
    log_info "     sudo ./ci/fix-yum-python.sh"
    log_info ""
    log_info "方案 2: 使用其他包管理器"
    log_info "  - 如果系统有 dnf: sudo dnf install -y python2 python2-devel"
    log_info "  - 如果有其他可用的包管理器，尝试使用它安装"
    log_info ""
    log_info "方案 3: 从其他系统复制"
    log_info "  - 如果有其他正常的 CentOS 7 系统，可以从那里复制 Python 2.7 的 RPM 包"
    
    cd /
    rm -rf "$TEMP_DIR"
    exit 1
fi

# 再次验证 RPM 包
log_info "验证下载的 RPM 包..."
if ! verify_rpm_file "${PYTHON2_RPM}"; then
    log_error "下载的文件不是有效的 RPM 包"
    log_info "文件信息:"
    ls -lh "${PYTHON2_RPM}" 2>/dev/null || true
    file "${PYTHON2_RPM}" 2>/dev/null || true
    log_info "文件前 100 个字符:"
    head -c 100 "${PYTHON2_RPM}" 2>/dev/null | cat -A || true
    cd /
    rm -rf "$TEMP_DIR"
    exit 1
fi

# 检查是否需要安装 python-libs（依赖）
log_info "检查依赖包..."
NEED_LIBS=false
LIBS_VERSION=""

if [ -n "$PYTHON_VERSION_MATCH" ]; then
    # 提取版本号用于匹配 libs
    LIBS_VERSION="$PYTHON_VERSION_MATCH"
    LIBS_RPM="python-libs-${LIBS_VERSION}.${ARCH}.rpm"
    
    if ! rpm -q python-libs &> /dev/null; then
        log_warning "缺少 python-libs 包，需要同时安装"
        NEED_LIBS=true
    elif [ "$(rpm -q python-libs 2>/dev/null | sed 's/^python-libs-//')" != "$LIBS_VERSION" ]; then
        log_warning "python-libs 版本不匹配，可能需要更新"
        NEED_LIBS=true
    fi
fi

# 安装下载的 RPM 包
log_info "安装 Python 2.7 RPM 包: ${PYTHON2_RPM}..."

# 如果版本不匹配，尝试使用 --nodeps 或先解决依赖
INSTALL_CMD="rpm -ivh"
if [ -n "$PYTHON_VERSION_MATCH" ]; then
    # 检查版本是否匹配
    RPM_VERSION=$(echo "$PYTHON2_RPM" | sed -n 's/.*python-\(.*\)\.x86_64\.rpm/\1/p')
    if [ "$RPM_VERSION" != "$PYTHON_VERSION_MATCH" ]; then
        log_warning "RPM 版本 ($RPM_VERSION) 与已安装版本 ($PYTHON_VERSION_MATCH) 不匹配"
        log_info "尝试使用 --nodeps 安装（可能需要手动解决依赖）"
        INSTALL_CMD="rpm -ivh --nodeps"
    fi
fi

if $INSTALL_CMD --force "${PYTHON2_RPM}" 2>&1; then
    log_success "✅ Python 2.7 安装成功"
    
    # 清理临时文件
    cd /
    rm -rf "$TEMP_DIR"
    
    # 验证安装
    if command -v python2.7 &> /dev/null || [ -f /usr/bin/python2.7 ]; then
        PYTHON2_PATH=$(which python2.7 2>/dev/null || echo "/usr/bin/python2.7")
        log_success "Python 2.7 路径: ${PYTHON2_PATH}"
        ${PYTHON2_PATH} --version 2>&1 || true
        
        # 运行 fix-yum-python.sh 确保 yum 使用 Python 2.7
        if [ -f "ci/fix-yum-python.sh" ]; then
            log_info "运行 fix-yum-python.sh 确保 yum 配置正确..."
            bash ci/fix-yum-python.sh || log_warning "fix-yum-python.sh 执行失败，但 Python 2.7 已安装"
        fi
        
        exit 0
    else
        log_error "Python 2.7 安装后无法找到"
        exit 1
    fi
else
    log_error "RPM 安装失败"
    log_info ""
    log_info "可能的原因："
    log_info "  - 版本冲突：已安装的 Python 包版本与下载的 RPM 不匹配"
    log_info "  - 缺少依赖：需要 python-libs 等依赖包"
    log_info ""
    
    if [ -n "$PYTHON_VERSION_MATCH" ]; then
        log_info "检测到系统已安装版本: ${PYTHON_VERSION_MATCH}"
        log_info "建议手动安装匹配的版本："
        log_info ""
        log_info "方案 1: 使用 yum 安装（如果可用）"
        log_info "  sudo yum install -y python python-libs python-devel"
        log_info ""
        log_info "方案 2: 下载匹配版本的 RPM 包"
        log_info "  需要下载: python-${PYTHON_VERSION_MATCH}.${ARCH}.rpm"
        log_info "  和依赖: python-libs-${PYTHON_VERSION_MATCH}.${ARCH}.rpm"
        log_info ""
        log_info "方案 3: 如果只是缺少可执行文件，检查 /usr/bin/python2.7 是否存在"
        if [ -f /usr/bin/python2.7 ]; then
            log_success "发现 /usr/bin/python2.7 存在！"
            log_info "可能只是 PATH 问题，尝试运行:"
            log_info "  /usr/bin/python2.7 --version"
            log_info "  或创建软链接: sudo ln -sf /usr/bin/python2.7 /usr/local/bin/python2.7"
        fi
    else
        log_info "请检查错误信息并手动安装"
    fi
    
    cd /
    rm -rf "$TEMP_DIR"
    exit 1
fi

